/**
 * author:Administrator
 * date:2013-5-19
 */
package com.roc.service.impl;

import java.sql.Date;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import org.apache.commons.collections.map.ListOrderedMap;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.roc.bean.MenuBean;
import com.roc.dao.DaoException;
import com.roc.dao.IMerchantModuleRight;
import com.roc.dao.IModuleDao;
import com.roc.pojo.Operators;
import com.roc.pojo.MerchantModuleRight;
import com.roc.pojo.Module;
import com.roc.pojo.ModuleCategory;
import com.roc.service.IModuleService;
import com.roc.service.ServiceException;

/**
 * @author Administrator
 *
 */
@Service
@Transactional
public class ModuleServiceImpl implements IModuleService {
	private Logger logger=LogManager.getLogger(ModuleServiceImpl.class);
    @Autowired
    IModuleDao moduleDao;
    @Autowired
    IMerchantModuleRight merchantModuleRight;
	
	public List<ModuleCategory> listMenuByMerchantNo(Operators merchant)
			throws ServiceException {
		List<MenuBean> menuList=new ArrayList<MenuBean>();
		List<ModuleCategory> categoryList=new ArrayList<ModuleCategory>();
		Map<String,ModuleCategory> categoryMenuMap=new TreeMap<String, ModuleCategory>();
		
		try {
			menuList=moduleDao.listMenuByMerchantNo(merchant);
			if(menuList!=null&&menuList.size()>0){
				ModuleCategory temp=new ModuleCategory();
				ModuleCategory moduleCategory=null;
				
				for(MenuBean bean:menuList){
					
					String moduleCotegoryCode=bean.getCategoryCode();
					if(!moduleCotegoryCode.equals(temp.getModuleCategoryCode())){
						moduleCategory=new ModuleCategory();
						temp.setModuleCategoryCode(bean.getCategoryCode());
						temp.setModuleCategoryName(bean.getCategoryName());
						
						moduleCategory.setModuleCategoryCode(bean.getCategoryCode());
						moduleCategory.setModuleCategoryName(bean.getCategoryName());
						Module module=new Module();
						module.setModuleCode(bean.getModuleCode());
						module.setModuleName(bean.getModuleName());
						module.setModuleAct(bean.getModuleAct());
						moduleCategory.getModules().add(module);
						categoryMenuMap.put(moduleCotegoryCode, moduleCategory);
					}else{
						Module module=new Module();
						module.setModuleCode(bean.getModuleCode());
						module.setModuleName(bean.getModuleName());
						module.setModuleAct(bean.getModuleAct());
						moduleCategory.getModules().add(module);
						categoryMenuMap.put(moduleCotegoryCode, moduleCategory);
					}
				}
				for(String key:categoryMenuMap.keySet()){
					categoryList.add(categoryMenuMap.get(key));
				}
			}
		} catch (DaoException e) {
			logger.error(e.getMessage(),e);
			e.printStackTrace();
			throw new ServiceException("查询用户权限失败");
			
		}
		return categoryList;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<ModuleCategory> listAllMenus(Operators merchant)
			throws ServiceException {
		List<MenuBean> menuList=new ArrayList<MenuBean>();
		List<ModuleCategory> categoryList=new ArrayList<ModuleCategory>();
		Map<String,ModuleCategory> categoryMenuMap=(Map<String, ModuleCategory>)new ListOrderedMap();
		
		try {
			menuList=moduleDao.listAllMenus(merchant);
			if(menuList!=null&&menuList.size()>0){
				ModuleCategory temp=new ModuleCategory();
				ModuleCategory moduleCategory=null;
				
				for(MenuBean bean:menuList){
					
					String moduleCotegoryCode=bean.getCategoryCode();
					if(!moduleCotegoryCode.equals(temp.getModuleCategoryCode())){
						moduleCategory=new ModuleCategory();
						temp.setModuleCategoryCode(bean.getCategoryCode());
						temp.setModuleCategoryName(bean.getCategoryName());
						
						moduleCategory.setModuleCategoryCode(bean.getCategoryCode());
						moduleCategory.setModuleCategoryName(bean.getCategoryName());
						Module module=new Module();
						module.setModuleCode(bean.getModuleCode());
						module.setModuleName(bean.getModuleName());
						module.setModuleAct(bean.getModuleAct());
						moduleCategory.getModules().add(module);
						categoryMenuMap.put(moduleCotegoryCode, moduleCategory);
					}else{
						Module module=new Module();
						module.setModuleCode(bean.getModuleCode());
						module.setModuleName(bean.getModuleName());
						module.setModuleAct(bean.getModuleAct());
						moduleCategory.getModules().add(module);
						categoryMenuMap.put(moduleCotegoryCode, moduleCategory);
					}
				}
				for(String key:categoryMenuMap.keySet()){
					categoryList.add(categoryMenuMap.get(key));
				}
			}
		} catch (DaoException e) {
			logger.error(e.getMessage(),e);
			e.printStackTrace();
			throw new ServiceException("查询用户权限失败");
			
		}
		return categoryList;
	}
	
public boolean setMerchantAthority(String merchantNo,List<String> toSaveList,List<ModuleCategory> athoritiedList,String modifyUser )throws ServiceException{
		
		List<String> tempList=new ArrayList<String>();
		try{
			if(toSaveList!=null&&toSaveList.size()>0){
				if(athoritiedList!=null&&athoritiedList.size()>0){
					for(ModuleCategory category:athoritiedList){
						for(Module module:category.getModules()){
							tempList.add(module.getModuleCode());
						}
					}
				}
				if(tempList==null||tempList.size()==0){
					for(String moduleCode:toSaveList){
						MerchantModuleRight right=new MerchantModuleRight();
						right.setMerchantNo(merchantNo);
						right.setModuleCode(moduleCode);
						right.setOperators(modifyUser);
						Date dtCreate=new Date(System.currentTimeMillis());
						right.setDtCreate(dtCreate);
						right.setDtCreate(dtCreate);
						//saveAthority(userName, moduleCode, modifyUser);
						merchantModuleRight.editSave(right);
					}
				}else{
					for(String moduleCode:toSaveList){
						if(tempList.contains(moduleCode)){
							tempList.remove(moduleCode);
							MerchantModuleRight right=merchantModuleRight.findByModuleCode(moduleCode, merchantNo);
							Date dtLostmod=new Date(System.currentTimeMillis());
							right.setDtLostmod(dtLostmod);
							merchantModuleRight.editUpdate(right);
							
						}else{
							//saveAthority(userName, moduleCode,modifyUser);
							MerchantModuleRight right=new MerchantModuleRight();
							right.setMerchantNo(merchantNo);
							right.setModuleCode(moduleCode);
							right.setOperators(modifyUser);
							Date dtCreate=new Date(System.currentTimeMillis());
							right.setDtCreate(dtCreate);
							right.setDtCreate(dtCreate);
							//saveAthority(userName, moduleCode, modifyUser);
							merchantModuleRight.editSave(right);
						}
					}
				}
			}
			if(tempList!=null&&tempList.size()>0){
				for(String moduleCode:tempList){
					MerchantModuleRight right=merchantModuleRight.findByModuleCode(moduleCode, merchantNo);
					merchantModuleRight.delete(right);
					//deleteAthority(userName, moduleCode);
				}
			}
		}catch(DaoException e){
			e.printStackTrace();
			throw new ServiceException(e.getMessage(),e);
		}
		
		return false;
	}

}
